/*
完成了一些零碎的功能接口，方便后面写项目时的使用：
    1. 获取系统时间 -- 获取当前时间戳
    2. 判断文件是否存在 -- 用于日志文件的创建
    3. 获取文件的所在目录路径
    4. 创建目录
*/

#ifndef __M_UTIL_H__
#define __M_UTIL_H__

#include <iostream>
#include <ctime>
#include <string>
#include <sys/stat.h>

namespace LogModule
{
    namespace UtilModule
    {
        class Date
        {
        public:
            // 1. 获取系统时间 -- 返回当前时间戳
            // time()：返回时间戳，传入非nullptr，将时间戳写入传入的地址
            static size_t Now() { return (size_t)time(nullptr); }
        };
        class File
        {
        public:
            // 2. 判断文件是否存在
            static bool Exists(const std::string &pathname)
            {
                struct stat st;
                // stat()：文件存在，返回0。不存在，返回-1
                return (stat(pathname.c_str(), &st) == 0);
            }
            // 3. 获取文件所在的目录路径，返回./a/b/c/
            static std::string Path(const std::string &pathname)
            {
                // ./a/b/c.txt
                // 找到/或者\都行，\\其中有一个\是转义符
                size_t pos = pathname.find_last_of("/\\");
                if (pos == std::string::npos)
                    return "./";
                return pathname.substr(0, pos + 1);
            }
            // 4. 创建目录
            static void CreateDirectory(const std::string &pathname)
            {
                // ./a/b/c.txt
                size_t pos = 0, idx = 0;
                while (idx < pathname.size())
                {
                    pos = pathname.find_first_of("/\\", idx); // 从idx处开始查找
                    if (pos == std::string::npos)
                    {
                        // c.txt -- 没有/和\的情况 -- 直接创建c.txt
                        mkdir(pathname.c_str(), 0777);
                        return;
                    }
                    // ./a/b/c.txt
                    std::string subdir = pathname.substr(0, pos + 1); // 得到./
                    if (Exists(subdir))
                    {
                        // 如果目录已经存在，比如./，就不需要创建
                        idx = pos + 1;
                        continue;
                    }
                    // 说明目录不存在，需要创建
                    mkdir(subdir.c_str(), 0777);
                    idx = pos + 1;
                }
            }
        };
    }
}

#endif